package thread;

import javafx.scene.SnapshotParameters;

/**
 *有效的缩小同步范围可以在保证并发安全的前提下提高并发效率
 * 同步块的应用：
 *
 * */
public class SyncDemo2 {
    public static void main(String[] args) {
          Shop shop = new Shop();
        //Shop shop1 = new Shop();
        //Shop shop2 = new Shop();

        //简化下面的代码：
/*
        Thread t1 = new Thread("熊大"){
            public void run(){
                shop.buy();
                //shop1.buy();
            }
        };
        Thread t2 = new Thread("熊二"){
            public void run(){
                shop.buy();
               // shop2.buy();
            }
        };
*/

        //lambda表达式简化代码：
//        Runnable r1 = ()->shop.buy();
//        Thread t1 = new Thread(r1);

        //进一步简化：
//        Thread t1 = new Thread(()->shop.buy());
//        Thread t2 = new Thread(()->shop.buy());


        //再一次简化：
        /*
            当lambda表达式只有一行代码时，可以简化为:
            ()->shop1.buy()
            ^^           ^^
             |---一致-----|
            如果此时lambda表达式的参数列表与这行代码调用的方法参数列表一致时
            可以简化为:方法引用的写法
            对象::方法名
            shop1::buy
         */
        Thread t1 = new Thread(shop::buy);
        Thread t2 = new Thread(shop::buy);
        t1.start();
        t2.start();

    }
}
class Shop{
    public  void buy() {
        try {
            Thread t = Thread.currentThread();
            System.out.println(t.getName() + "正在找光头强");
            Thread.sleep(5000);
 /*
                同步块使用时需要指定同步监视器对象
                1：同步监视器对象必须是一个引用类型
                2：多个线程看到的必须是【同一个对象】

                合适的锁对象
                当多个现在存在并发安全问题时，它们应当看到的是同一个监视器对象
                反之应当看到的不是同一个。
                字符串字面量任何时候看到的都是同一个对象，因此虽然有效但是不合适。
             */

            synchronized (this) {     //定义一个shop 用this排队
            //synchronized ("hello") {//shop1 shop2 "hello"排队
                System.out.println(t.getName() + "正在揍光头强");
                Thread.sleep(5000);
            }

            System.out.println(t.getName()+":揍完离开");
        } catch (InterruptedException e) {
        }

    }

 }